package es.elultimorey.toctoc;

import java.util.LinkedList;
import java.util.Random;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Vibrator;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

public class TocTocActivity extends Activity {

	// combinacion es una lista de string donde cada string es una luz
	//	ej: "dostres" es la luz de la fila dos columna tres
	LinkedList<String> combinacion = new LinkedList<String>();
	// Para controlar que sólo se pulse el botón de inicio de partida una vez
	//	false -> partida no en curso || true -> partida en curso
	boolean estado = false;

	/** Called when the activity is first created. */	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		final Button bt = (Button) findViewById(R.id.button1);

		// Cuando se pulsa el botón se inicia la partida
		//	El botón deja de ser visible y comienza el juego
		bt.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				if (!estado) {
					bt.setVisibility(100);
					estado = true;
					juego();
				}
			}
		});

	}

	// Añade una luz a combinación
	public void addLight() {
		String nuevo = "";
		int aleatorio;
		Random rand = new Random();
		for (int i = 0; i < 2; i++) {
			aleatorio = rand.nextInt(100);
			aleatorio = (aleatorio % 3);
			if (aleatorio == 0) {
				nuevo += "tres";
			}
			else if (aleatorio == 1) {
				nuevo += "uno";
			}

			else if (aleatorio == 2) {
				nuevo += "dos";
			}
		}
		combinacion.addLast(nuevo.toString());

	}

	// Muestra la primera luz de la lista
	//	La luz se muestra durante un segundo (cuando el countDownTimer acaba vuelve a rojo)
	public void mostrar (final LinkedList<String> lista) {
		final ImageView unouno = (ImageView) findViewById(R.id.unouno);
		final ImageView unodos = (ImageView) findViewById(R.id.unodos);
		final ImageView unotres = (ImageView) findViewById(R.id.unotres);
		final ImageView dosuno = (ImageView) findViewById(R.id.dosuno);
		final ImageView dosdos = (ImageView) findViewById(R.id.dosdos);
		final ImageView dostres = (ImageView) findViewById(R.id.dostres);
		final ImageView tresuno = (ImageView) findViewById(R.id.tresuno);
		final ImageView tresdos = (ImageView) findViewById(R.id.tresdos);
		final ImageView trestres = (ImageView) findViewById(R.id.trestres);
		String boton = lista.getFirst();

		if ( boton.equals("unouno") ) {
			unouno.setImageResource(R.drawable.cuadradoverde);
			Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
			v1.vibrate(300);
			new CountDownTimer(1000, 1000) {
				public void onTick(long millisUntilFinished) {
				}
				public void onFinish() {
					unouno.setImageResource(R.drawable.cuadradorojo);
				}
			}.start();
		}
		else if ( boton.equals("unodos") ) {
			unodos.setImageResource(R.drawable.cuadradoverde);
			Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
			v1.vibrate(300);
			new CountDownTimer(1000, 1000) {
				public void onTick(long millisUntilFinished) {
				}
				public void onFinish() {
					unodos.setImageResource(R.drawable.cuadradorojo);
				}
			}.start();
		}
		else if ( boton.equals("unotres") ) {
			unotres.setImageResource(R.drawable.cuadradoverde);
			Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
			v1.vibrate(300);
			new CountDownTimer(1000, 1000) {
				public void onTick(long millisUntilFinished) {
				}
				public void onFinish() {
					unotres.setImageResource(R.drawable.cuadradorojo);
				}
			}.start();
		}
		else if ( boton.equals("dosuno") ) {
			dosuno.setImageResource(R.drawable.cuadradoverde);
			Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
			v1.vibrate(300);
			new CountDownTimer(1000, 1000) {
				public void onTick(long millisUntilFinished) {
				}
				public void onFinish() {
					dosuno.setImageResource(R.drawable.cuadradorojo);
				}
			}.start();
		}
		else if ( boton.equals("dosdos") ) {
			dosdos.setImageResource(R.drawable.cuadradoverde);
			Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
			v1.vibrate(300);
			new CountDownTimer(1000, 1000) {
				public void onTick(long millisUntilFinished) {
				}
				public void onFinish() {
					dosdos.setImageResource(R.drawable.cuadradorojo);
				}
			}.start();
		}
		else if ( boton.equals("dostres") ) {
			dostres.setImageResource(R.drawable.cuadradoverde);
			Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
			v1.vibrate(300);
			new CountDownTimer(1000, 1000) {
				public void onTick(long millisUntilFinished) {
				}
				public void onFinish() {
					dostres.setImageResource(R.drawable.cuadradorojo);
				}
			}.start();
		}
		else if ( boton.equals("tresuno") ) {
			tresuno.setImageResource(R.drawable.cuadradoverde);
			Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
			v1.vibrate(300);
			new CountDownTimer(1000, 1000) {
				public void onTick(long millisUntilFinished) {
				}
				public void onFinish() {
					tresuno.setImageResource(R.drawable.cuadradorojo);
				}
			}.start();
		}
		else if ( boton.equals("tresdos") ) {
			tresdos.setImageResource(R.drawable.cuadradoverde);
			Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
			v1.vibrate(300);
			new CountDownTimer(1000, 1000) {
				public void onTick(long millisUntilFinished) {
				}
				public void onFinish() {
					tresdos.setImageResource(R.drawable.cuadradorojo);
				}
			}.start();
		}
		else if ( boton.equals("trestres") ) {
			trestres.setImageResource(R.drawable.cuadradoverde);
			Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
			v1.vibrate(300);
			new CountDownTimer(1000, 1000) {
				public void onTick(long millisUntilFinished) {
				}
				public void onFinish() {
					trestres.setImageResource(R.drawable.cuadradorojo);
				}
			}.start();
		}
	}

	
	// Muestra la combinación guardada
	// Cuando acaba de mostrarla pasa a comprobar la secuencia insertada por el usuario
	public void play(final LinkedList<String> lista) {
		// Muestra la primera luz
		mostrar(new LinkedList<String>(lista));
		// Elimina la luz mostrada
		lista.removeFirst();
		// Comprueba el tamaño de la lista
		if (lista.size()>0){
			new CountDownTimer(2000, 1000) {
				@Override
				public void onFinish() {
					// Muestra la lista restante (la misma secuencia menos la primera luz)
					play(new LinkedList<String>(lista));
				}
				@Override
				public void onTick(long millisUntilFinished) {
					//
				}

			}.start();
		}
		else {
			comprobar(new LinkedList<String>(combinacion));
		}
	}

	
	// Comprueba que la secuencia insertada por el usuario es la misma que hay en 'combinacion'
	public void comprobar(final LinkedList<String> lista) {
		final LinkedList<String> comp = new LinkedList<String>();		

		final ImageView unouno = (ImageView) findViewById(R.id.unouno);
		final ImageView unodos = (ImageView) findViewById(R.id.unodos);
		final ImageView unotres = (ImageView) findViewById(R.id.unotres);
		final ImageView dosuno = (ImageView) findViewById(R.id.dosuno);
		final ImageView dosdos = (ImageView) findViewById(R.id.dosdos);
		final ImageView dostres = (ImageView) findViewById(R.id.dostres);
		final ImageView tresuno = (ImageView) findViewById(R.id.tresuno);
		final ImageView tresdos = (ImageView) findViewById(R.id.tresdos);
		final ImageView trestres = (ImageView) findViewById(R.id.trestres);
		final TextView contador = (TextView) findViewById(R.id.contador);	

		// AlertDialog para más adelante guardar la puntuación
		final AlertDialog.Builder alertDialog = new AlertDialog.Builder(TocTocActivity.this);
		alertDialog.setTitle("!!!!!");
		alertDialog.setMessage("!!!");
		final EditText input = new EditText(TocTocActivity.this);
		input.setText("");
		alertDialog.setView(input);
		alertDialog.setNegativeButton("!", new DialogInterface.OnClickListener() {  
			public void onClick(DialogInterface dialog, int whichButton) {
				//
			}
		});


		// Cuando se pulsa vibra durante 300ms
		unouno.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
				v1.vibrate(300);
			}
		});

		unodos.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
				v1.vibrate(300);
			}
		});

		unotres.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
				v1.vibrate(300);
			}
		});

		dosuno.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
				v1.vibrate(300);
			}
		});

		dosdos.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
				v1.vibrate(300);
			}
		});

		dostres.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
				v1.vibrate(300);
			}
		});

		tresuno.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
				v1.vibrate(300);

			}
		});

		tresdos.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
				v1.vibrate(300);

			}
		});

		trestres.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Vibrator v1 = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
				v1.vibrate(300);
			}
		});

		// Cambio imagen ImageView en el tiempo que se está pulsando
		// Si la luz pulsada es la que debe ser se incrementa el contador en 1
		//		Si es la última luz de la secuencia se inicia otra muestra de la secuencia con una luz añadida
		//	 		tras esperar 2s
		//		Si no es la última luz sigue esperando a lo que el usuario introduce
		// Si no es la luz correspondiente en la secuenca salta el AlertDialog (y fin del juego)
		
		// TODO En el CountDown de 2s para empezar a mostrar la secuencia
		//		Si se pulsa un boton FORCE CLOSE
		// TODO Añadir top 5 máximas puntuaciones
		unouno.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {

				if(event.getAction()==MotionEvent.ACTION_DOWN) {
					//Cuando pulsas
					unouno.setImageResource(R.drawable.cuadradoverde);
					comp.add("unouno");
				}
				else if(event.getAction()==MotionEvent.ACTION_UP) {
					unouno.setImageResource(R.drawable.cuadradorojo);
					if (comp.getLast().equals(lista.get(comp.size()-1))) {
						contador.setText(String.valueOf((Integer.parseInt((String) contador.getText())+1)));
						if (comp.size() == lista.size())
							new CountDownTimer(2000, 1000) {

							@Override
							public void onTick(long millisUntilFinished) {
							}

							@Override
							public void onFinish() {
								juego();
							}
						}.start();
					}
					else {
						alertDialog.show();
					}
				}

				return false;
			}
		});

		unodos.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {

				if(event.getAction()==MotionEvent.ACTION_DOWN) {
					//Cuando pulsas
					unodos.setImageResource(R.drawable.cuadradoverde);
					comp.add("unodos");
				}
				else if(event.getAction()==MotionEvent.ACTION_UP) {
					unodos.setImageResource(R.drawable.cuadradorojo);
					if (comp.getLast().equals(lista.get(comp.size()-1))) {
						contador.setText(String.valueOf((Integer.parseInt((String) contador.getText())+1)));
						if (comp.size() == lista.size())
							new CountDownTimer(2000, 1000) {

							@Override
							public void onTick(long millisUntilFinished) {
							}

							@Override
							public void onFinish() {
								juego();
							}
						}.start();
					}
					else {
						alertDialog.show();
					}
				}

				return false;
			}
		});

		unotres.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {

				if(event.getAction()==MotionEvent.ACTION_DOWN) {
					//Cuando pulsas
					unotres.setImageResource(R.drawable.cuadradoverde);
					comp.add("unotres");
				}
				else if(event.getAction()==MotionEvent.ACTION_UP) {
					unotres.setImageResource(R.drawable.cuadradorojo);
					if (comp.getLast().equals(lista.get(comp.size()-1))) {
						contador.setText(String.valueOf((Integer.parseInt((String) contador.getText())+1)));
						if (comp.size() == lista.size())
							new CountDownTimer(2000, 1000) {

							@Override
							public void onTick(long millisUntilFinished) {
							}

							@Override
							public void onFinish() {
								juego();
							}
						}.start();
					}
					else {
						alertDialog.show();
					}
				}

				return false;
			}
		});

		dosuno.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {

				if(event.getAction()==MotionEvent.ACTION_DOWN) {
					//Cuando pulsas
					dosuno.setImageResource(R.drawable.cuadradoverde);
					comp.add("dosuno");
				}
				else if(event.getAction()==MotionEvent.ACTION_UP) {
					dosuno.setImageResource(R.drawable.cuadradorojo);
					if (comp.getLast().equals(lista.get(comp.size()-1))) {
						contador.setText(String.valueOf((Integer.parseInt((String) contador.getText())+1)));
						if (comp.size() == lista.size())
							new CountDownTimer(2000, 1000) {

							@Override
							public void onTick(long millisUntilFinished) {
							}

							@Override
							public void onFinish() {
								juego();
							}
						}.start();
					}
					else {
						alertDialog.show();
					}
				}

				return false;
			}
		});

		dosdos.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {

				if(event.getAction()==MotionEvent.ACTION_DOWN) {
					//Cuando pulsas
					dosdos.setImageResource(R.drawable.cuadradoverde);
					comp.add("dosdos");
				}
				else if(event.getAction()==MotionEvent.ACTION_UP) {
					dosdos.setImageResource(R.drawable.cuadradorojo);
					if (comp.getLast().equals(lista.get(comp.size()-1))) {
						contador.setText(String.valueOf((Integer.parseInt((String) contador.getText())+1)));
						if (comp.size() == lista.size())
							new CountDownTimer(2000, 1000) {

							@Override
							public void onTick(long millisUntilFinished) {
							}

							@Override
							public void onFinish() {
								juego();
							}
						}.start();
					}
					else {
						alertDialog.show();
					}
				}

				return false;
			}
		});

		dostres.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {

				if(event.getAction()==MotionEvent.ACTION_DOWN) {
					//Cuando pulsas
					dostres.setImageResource(R.drawable.cuadradoverde);
					comp.add("dostres");
				}
				else if(event.getAction()==MotionEvent.ACTION_UP) {
					dostres.setImageResource(R.drawable.cuadradorojo);
					if (comp.getLast().equals(lista.get(comp.size()-1))) {
						contador.setText(String.valueOf((Integer.parseInt((String) contador.getText())+1)));
						if (comp.size() == lista.size())
							new CountDownTimer(2000, 1000) {

							@Override
							public void onTick(long millisUntilFinished) {
							}

							@Override
							public void onFinish() {
								juego();
							}
						}.start();
					}
					else {
						alertDialog.show();
					}
				}

				return false;
			}
		});

		tresuno.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {

				if(event.getAction()==MotionEvent.ACTION_DOWN) {
					//Cuando pulsas
					tresuno.setImageResource(R.drawable.cuadradoverde);
					comp.add("tresuno");
				}
				else if(event.getAction()==MotionEvent.ACTION_UP) {
					tresuno.setImageResource(R.drawable.cuadradorojo);
					if (comp.getLast().equals(lista.get(comp.size()-1))) {
						contador.setText(String.valueOf((Integer.parseInt((String) contador.getText())+1)));
						if (comp.size() == lista.size())
							new CountDownTimer(2000, 1000) {

							@Override
							public void onTick(long millisUntilFinished) {
							}

							@Override
							public void onFinish() {
								juego();
							}
						}.start();
					}
					else {
						alertDialog.show();
					}
				}

				return false;
			}
		});

		tresdos.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {

				if(event.getAction()==MotionEvent.ACTION_DOWN) {
					//Cuando pulsas
					tresdos.setImageResource(R.drawable.cuadradoverde);
					comp.add("tresdos");
				}
				else if(event.getAction()==MotionEvent.ACTION_UP) {
					tresdos.setImageResource(R.drawable.cuadradorojo);
					if (comp.getLast().equals(lista.get(comp.size()-1))) {
						contador.setText(String.valueOf((Integer.parseInt((String) contador.getText())+1)));
						if (comp.size() == lista.size())
							new CountDownTimer(2000, 1000) {

							@Override
							public void onTick(long millisUntilFinished) {
							}

							@Override
							public void onFinish() {
								juego();
							}
						}.start();
					}
					else {
						alertDialog.show();
					}
				}

				return false;
			}
		});

		trestres.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {

				if(event.getAction()==MotionEvent.ACTION_DOWN) {
					//Cuando pulsas
					trestres.setImageResource(R.drawable.cuadradoverde);
					comp.add("trestres");
				}
				else if(event.getAction()==MotionEvent.ACTION_UP) {
					trestres.setImageResource(R.drawable.cuadradorojo);
					if (comp.getLast().equals(lista.get(comp.size()-1))) {
						contador.setText(String.valueOf((Integer.parseInt((String) contador.getText())+1)));
						if (comp.size() == lista.size())
							new CountDownTimer(2000, 1000) {

							@Override
							public void onTick(long millisUntilFinished) {
							}

							@Override
							public void onFinish() {
								juego();
							}
						}.start();
					}
					else {
						alertDialog.show();
					}
				}

				return false;
			}
		});

	}

	// Añade una luz a la secuencia combinacion
	// Se eliminan los efectos de los ImageViews
	public void juego() {	
		
		this.addLight();

		final ImageView unouno = (ImageView) findViewById(R.id.unouno);
		final ImageView unodos = (ImageView) findViewById(R.id.unodos);
		final ImageView unotres = (ImageView) findViewById(R.id.unotres);
		final ImageView dosuno = (ImageView) findViewById(R.id.dosuno);
		final ImageView dosdos = (ImageView) findViewById(R.id.dosdos);
		final ImageView dostres = (ImageView) findViewById(R.id.dostres);
		final ImageView tresuno = (ImageView) findViewById(R.id.tresuno);
		final ImageView tresdos = (ImageView) findViewById(R.id.tresdos);
		final ImageView trestres = (ImageView) findViewById(R.id.trestres);
		
		unouno.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			}
		});

		unodos.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			}
		});

		unotres.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			}
		});

		dosuno.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			}
		});

		dosdos.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			}
		});

		dostres.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			}
		});

		tresuno.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			}
		});

		tresdos.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			}
		});

		trestres.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			}
		});

		// Cambio imagen ImageView
		unouno.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return false;
			}
		});

		unodos.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return false;
			}
		});

		unotres.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return false;
			}
		});

		dosuno.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return false;
			}
		});

		dosdos.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return false;
			}
		});

		dostres.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return false;
			}
		});

		tresuno.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return false;
			}
		});

		tresdos.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return false;
			}
		});

		trestres.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return false;
			}
		});

		play(new LinkedList<String>(combinacion));
	}

}